/*
 * @Author: Xavier 1305433186@qq.com
 * @Date: 2024-05-08 17:00:03
 * @LastEditors: Xavier 1305433186@qq.com
 * @LastEditTime: 2024-07-29 17:09:45
 * @FilePath: \KEIL-ARMd:\Users\HXD\Desktop\拓基\面板\JS32T031_SDK\User\modul_demo\ftms_demo_uart.c
 * @Description:
 *
 * STAYTRUE (c) 2024 by ${Xavier}, All Rights Reserved.
 */
/*
 * @file:ble_ftms.h
 *
 * @date: 2019-8-14
 * @author: l00357454
 */

#include "ble_ftms.h"
#include "ftmp_uart.h"
#include "js32t031_system.h"
#include "string.h"

/*
单位 0.01 km/h
最小档位 2km/h  最大档位 10km/h   最小调节档位 0.1kmh
*/
#define minSpeed 200         // 2km/h
#define maxSpeed 1000        // 10km/h
#define minSpeedIncrement 10 // 0.1kmh
/*
单位 0.1 percent
最小档位 0  最大档位 100   最小调节档位 1 共 11档
*/
#define minInclination 0           //
#define maxInclination 1000        //
#define minInclinationIncrement 10 //

#define minHeartRate 50         //
#define maxHeartRate 200        //
#define minHeartRateIncrement 1 //

#define MetricSystem 0XF0  // 公制
#define BritishSystem 0X0F // 英制

extern void UartCommand(char *data, int len);

/*
 * 串口接收
 */
void uart_accept(char *pBuff, int len)
{
    UartCommand(pBuff, len);
}
/*
 * 串口发送
 */
void uart_send(unsigned char *pBuff, int len)
{
    /*串口功能接口*/
    // ui_uart_block_writebuf(APP_UART, pBuff, len); // 需要修改
}

/// @brief 蓝牙模组配置
/// @param 无
void bluetooth_modul_Configuration(void)
{
    delay_ms(50);
    // 设置版本  面板程序版本号上传
    HardwareVersionWrite("V1.0.0_240621", strlen("V1.0.0_240621"));
    delay_ms(50);
    // 设置型号
    ModelWrite("NQ1", strlen("NQ1"));
    delay_ms(50);
    // 设置单位 公制
    SpeedUnitslWrite(MetricSystem);
    delay_ms(50);
    // 速度范围调用示例。
    SpeedRangeWrite(minSpeed, maxSpeed, minSpeedIncrement);
    delay_ms(50);
    // 坡度范围调用示例。
    InclinationRangeWrite(minInclination, maxInclination, minInclinationIncrement);
    delay_ms(50);
    // 心率范围调用示例。
    HeartRateRangeWrite(minHeartRate, maxHeartRate, minHeartRateIncrement);
    delay_ms(50);
    // 设置健身机特性用示例
    /*健身机特点*/
    unsigned long FitnessMachineFeature = average_speed | total_distance | expended_energy | elapsed_time;
    // /*目标设置功能*/
    unsigned long TargetSettingFeatures = speed_target_setting; // target_setting_feature  枚举
    FitnessMachineFeatureAccessWrite(FitnessMachineFeature, TargetSettingFeatures);
    delay_ms(50);
    BleStateSet(0x00); // 开启广播
    delay_ms(50);
    BleStateRequest(); // 请求蓝牙状态
    delay_ms(50);
    // 运动状态调用示例。  状态变更时上报
    TrainingStatusAccessWrite(idle);
}

/* MCU侧出现需要Notification的处理
 * 整体发送流程： UartCommandNotificationDispatch -数据接口 -sendUartDataToApp --发送到APP 的完整流程
 * 该函数可换成厂商自己的对应函数实现，此处仅示意
 */
void UartCommandNotificationDispatch(char *pBuff, int len)
{
    // 跑步机数据上报 调用示例  此接口每秒上报
    // 示例给出 最基本数据上报，若需新增上报数据， 对 flags 赋值相应  flags位， 查看 treadmill_data_field 枚举
    // 跑步机数据 查看 TREADMILL_DATA_T 结构体
    TREADMILL_DATA_T data;
    data.flags = instantaneous_speed | treadmill_average_speed | treadmill_total_distance | treadmill_elapsed_time | treadmill_expended_energy;
    data.instantaneousSpeed = 0X10; // 瞬时速度 单位：0.01km/h
    data.averageSpeed = 0X20;       // 平均速度 单位：0.01km/h
    data.totalDistance = 0X30;      // 里程 单位：m
    data.totalEnergy = 0X100;       // 卡路里  单位：kal
    data.energyPerHour = 0xffff;    // 此数据无效时，填写0xffff
    data.energyPerMinute = 0xff;    // 此数据无效时，填写0xff
    data.elapsedTime = 0x10F;       // 运行时间 ，单位： 秒
    TreadmillDataAccessNotify(&data);
    return;
}

/* 运动状态调用示例。
需要支持
    idle(空闲状态)
    pre_workout(预启动状态)
    quick_start(快速开始)
    pre_workout(预结束状态)
*/
// TrainingStatusAccessWrite(idle);
// TrainingStatusAccessWrite(pre_workout);
// TrainingStatusAccessWrite(quick_start);
// TrainingStatusAccessWrite(pre_workout);

/* 当器械状态有变化时，通过此接口将状态实时通知到蓝牙端APP:
 用户在器械面板开始、暂停、恢复、停止等，见枚举值定义；
 需要支持
    start_by_user = 0x04,// 由用户启动或恢复健身器
    target_speed_changed = 0x05,	// 参数：uint16
    target_incline_changed = 0x06,// 参数：sint16
    pause_by_user = 0x00,  // 用户暂停
    stop_by_user = 0x02, // 用户停止 参数：无
    status_reset = 0x01,    //状态重置
    stop_by_safety_key = 0x03 // 安全锁停止 参数：无
 */
// FitnessMachineStatusnotify(start_by_user, NULL);
/*
speed = 100; 1.0km/h
data_str[0] = speed;
data_str[1] = speed >> 8;
FitnessMachineStatusnotify(target_speed_changed, data_str);
*/
// FitnessMachineStatusnotify(target_speed_changed, NULL);
// FitnessMachineStatusnotify(target_incline_changed, NULL);
// FitnessMachineStatusnotify(pause_by_user, NULL);
// FitnessMachineStatusnotify(stop_by_user, NULL);
// FitnessMachineStatusnotify(status_reset, NULL);
// FitnessMachineStatusnotify(stop_by_safety_key, NULL);
